package extra;

import interpreteur.action.Foncteur;

public class LinkStack<D> {

    private Node top;

    public LinkStack() {
        top = null;
    }

    public boolean empty() {
        return top == null;
    }

    public boolean full() {
        return false;
    }

    public void push(D e) {
        Node tmp = new Node(e);
        tmp.next = top;
        top = tmp;
    }

    public D pop() {
        D e = (D) top.data;
        top = top.next;
        return e;
    }

    public D peek() {
        D e = (D) top.data;
        return e;
    }

    public void Evaluation(String input) {

        LinkStack S = new LinkStack();
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            String s = "0" + c;

            if (c == 'P') {
                Foncteur predWhile = (Foncteur) S.pop();
                Foncteur action = (Foncteur) S.pop();
                Foncteur action2 = (Foncteur) S.pop();
                Foncteur action3 = (Foncteur) S.pop();


                int z = Integer.parseInt((String) S.pop()) + Integer.parseInt((String) S.pop());
                S.push(Integer.toString(z));
            } else if (c == '.') {
                int z = Integer.parseInt((String) S.pop()) * Integer.parseInt((String) S.pop());
                S.push(Integer.toString(z));

            } //            else if (c == '/') {
            //                int u = Integer.parseInt((String) S.pop());
            //
            //                int z = Integer.parseInt((String) S.pop()) / u;
            //                S.push(Integer.toString(z));
            //
            //            } else if (c == '-') {
            //                int u = Integer.parseInt((String) S.pop());
            //                int z = Integer.parseInt((String) S.pop()) - u;
            //                S.push(Integer.toString(z));
            //            }
            else {
                S.push(s);
            }
        }
        System.out.println("THE POSTFIX = " + input);
        System.out.println("THE RESULT = " + S.pop());
    }

    public String postfix(String input) {
        String output = "";
        LinkStack S = new LinkStack();
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);

            if (c == ('P')) {
                while (!S.empty() && priority1(S.peek()) >= priority1(c)) {
                    output += S.pop();
                }
                S.push(c);
            } else if (c == '(') {
                S.push(c);
            } else if (c == ')') {
                while (!S.peek().equals('(')) {
                    output += S.pop();
                }
                S.pop();
            } else {
                output += c;
            }
        }
        while (!S.empty()) {
            output += S.pop();
        }
        return output;
    }

//    public int priority0(Object input) {
//
//        if (input.equals('+') || input.equals('-')) {
//            return 1;
//        } else if (input.equals('*') || input.equals('/')) {
//            return 2;
//        } else {
//            return 0;
//        }
//    }
    public int priority1(Object x) {

        if (x.equals('P')) {
            return 2;
        } else if (x.equals('.') || x.equals('S')) {
            return 1;
        } else {
            return 0;
        }

    }
}

